package compare

// CompareSlices 使用泛型对比两个切片 A 和 B
// - T: 切片元素的类型，必须是可比较的类型
// 返回两个切片：OnlyA 和 OnlyB
// - OnlyA: 仅在 A 中存在的元素
// - OnlyB: 仅在 B 中存在的元素
func CompareSlices[T Comparable](a, b []T) (OnlyA []T, OnlyB []T) {
	// 使用 map 来记录 A 和 B 的元素
	mapA := make(map[T]struct{})
	mapB := make(map[T]struct{})

	// 将 A 的元素存入 mapA
	for _, v := range a {
		mapA[v] = struct{}{}
	}

	// 将 B 的元素存入 mapB
	for _, v := range b {
		mapB[v] = struct{}{}
	}

	// 遍历 A，根据条件将元素加入 OnlyA
	for _, v := range a {
		if _, existsInB := mapB[v]; !existsInB {
			OnlyA = append(OnlyA, v)
		}
	}

	// 遍历 B，根据条件将元素加入 OnlyB
	for _, v := range b {
		if _, existsInA := mapA[v]; !existsInA {
			OnlyB = append(OnlyB, v)
		}
	}

	return OnlyA, OnlyB
}
